S3のフォルダ配下のオブジェクトをすべて削除したときの挙動について
S3をローカルディスクと同じように考えて利用していて、少しハマったので共有させていただきます。
タイトルにはわかりやすいように書いてしまっていますが、次の記事のように普通のローカルディスクにあるような"フォルダ"という概念はS3には存在しません。
このため、フォルダがあるように考えて利用すると、思うように行かない場面がありました。
あるPrefix以下のオブジェクトをすべて削除すると…?
結果を言うと、S3のあるPrefix配下のオブジェクトをすべて削除したとき、"フォルダ"も一緒に消えてしまいます。
次のようにAWS CLIからファイルを作成してみます。
$ aws s3 mv sample.txt s3://sample-bucket-name123/sampleFolder/sample.txt
AWSのWebコンソール上から見ると、
のように表示され、sampleFolderというフォルダがあり、その中にsample.txtが入っているように見えます。
普通のローカルディスクのフォルダとファイルの関係であれば、ファイルを削除してもフォルダは残るように考えるかと思います。しかし冒頭の記事のとおり、S3のファイル名は単にキーなので、ファイルを削除すると、
$ aws s3 rm s3://sample-bucket-name123/sampleFolder/sample.txt
上記の通り"フォルダ"も一緒になくなってしまいます。
対策
存在しないprefixに対して次のようにリスト操作をかけても、
$ aws s3api list-objects-v2 --bucket sample-bucket-name123 --prefix notExistsPrefix/
特にエラーにはならないので大抵の場合は大丈夫かと思いますが、何らかの理由により"フォルダ"があるように見せたい場合の対処について記載しておきます。
次のようなコマンドで、"フォルダオブジェクト"を作成することにより、
$ aws s3api put-object --bucket sample-bucket-name123 --key sampleFolder/
配下のオブジェクトを作成、削除しても"フォルダ"が残ったままにすることが出来ます。
$ aws s3 mv sample.txt s3://sample-bucket-name123/sampleFolder/sample.txt $ aws s3 rm s3://sample-bucket-name123/sampleFolder/sample.txt $ aws s3api list-objects-v2 --bucket sample-bucket-name123 --prefix sample-folder/ { "Contents": [ { "Key": "sample-folder/", "LastModified": "2018-10-15T01:37:59.000Z", "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", "Size": 0, "StorageClass": "STANDARD" } ] }
おわりに
S3についてある程度理解していないと、ちょっと分かりづらい記事になってしまったかもしれません。 冒頭にある記事をよく読み、S3のキーというものがどういうものか理解したのであれば、この記事の内容も理解できるかと思います。